Tensorarrayread

从张量数组中读取指定索引的张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。

\[\text{output\_data} = \text{handle\_data}[\text{index}]\]

该算子会将 handle_data[index] 指向的数据复制到 output_data 中,复制的大小为 handle_size[index] 字节。

输入:
  • handle_data - 张量数组的数据指针数组(void** 类型),每个元素指向一个张量的数据。

  • handle_size - 每个张量的大小数组(int* 类型),handle_size[i] 表示 handle_data[i] 指向的数据大小(字节)。

  • index - 读取的索引(int 类型),指定从 handle_data 数组中读取哪个张量。

  • core_mask - 核掩码(int),仅共享存储版本需要。

输出:
  • output_data - 输出数据指针(void* 类型),包含复制后的数据。

  • output_size - 输出大小指针(int* 类型),指向存储输出大小的变量。调用后,*output_size 会被设置为 handle_size[index]

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp32, int16, int32, cplx64

  • MT7004 支持fp16, fp32, int16, int32, cplx64

  • 算子会复制数据,输出数据与输入数据独立

  • 调用前需要确保 output_data 指向的内存空间足够大(至少 handle_size[index] 字节)

  • index 必须在 handle_data 数组的有效范围内

共享存储版本:

void fp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void hp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void dp_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void i8_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void i16_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void i32_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void c64_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)
void c128_tensorarrayread_s(void **handle_data, int *handle_size, int index, void *output_data, int *output_size, int core_mask)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <tensorarrayread.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在DDR空间
 7    // 张量数组包含3个张量
 8    float *data0 = (float *)0xA0000000;  // 第0个张量的数据
 9    float *data1 = (float *)0xA1000000;  // 第1个张量的数据
10    float *data2 = (float *)0xA2000000;  // 第2个张量的数据
11
12    // 每个张量的大小(字节)
13    int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
14
15    // 创建数据指针数组
16    void* handle_data[3] = {data0, data1, data2};
17
18    // 输出数据
19    float *output_data = (float *)0xB0000000;  // 需要预先分配足够的内存
20    int output_size;  // 输出大小,调用后会被设置
21
22    int index = 1;  // 读取第1个张量
23    int core_mask = 0xff;
24
25    fp_tensorarrayread_s(handle_data, sizes, index, output_data, &output_size, core_mask);
26
27    // 此时 output_data 包含 data1 的副本
28    // output_size == sizes[1] == 1000 * sizeof(float)
29
30    return 0;
31}

私有存储版本:

void fp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void hp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void dp_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void i8_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void i16_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void i32_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void c64_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)
void c128_tensorarrayread_p(void **handle_data, int *handle_size, int index, void *output_data, int *output_size)

C调用示例:

 1//FT78NE示例
 2#include <stdio.h>
 3#include <tensorarrayread.h>
 4
 5int main(int argc, char* argv[]) {
 6    // 假设在L2空间
 7    float *data0 = (float *)0x10000000;
 8    float *data1 = (float *)0x10001000;
 9    float *data2 = (float *)0x10002000;
10
11    int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)};
12
13    void* handle_data[3] = {data0, data1, data2};
14
15    float *output_data = (float *)0x10003000;  // 需要预先分配足够的内存
16    int output_size;
17
18    int index = 0;  // 读取第0个张量
19
20    fp_tensorarrayread_p(handle_data, sizes, index, output_data, &output_size);
21
22    return 0;
23}